/**
 * 处理未找到资源的中间件
 *
 * 当请求的路由在应用中未定义时，调用此中间件返回404错误信息
 * 它创建一个错误对象，包含未找到的URL，并设置响应状态码为404，然后将控制权交给下一个错误处理中间件
 *
 * @param {Object} req Express请求对象，包含请求相关的信息
 * @param {Object} res Express响应对象，用于发送HTTP响应
 * @param {Function} next 一个函数，用于将控制权移交给下一个中间件或错误处理函数
 */
export const notFound = (req, res, next) => {
  // 创建一个错误对象，消息体中包含请求的原始URL
  const error = new Error(`Not Found - ${req.originalUrl}`);
  // 设置HTTP响应状态码为404，表示未找到资源
  res.status(404);
  // 将创建的错误对象传递给下一个错误处理中间件
  next(error);
};


/**
 * 错误处理中间件
 *
 * 该中间件用于捕获全局错误，并返回给客户端一个友好的错误响应它首先决定是否需要更改响应的状态码，
 * 如果尚未设置为除200之外的其他状态码，则默认将其更改为500（内部服务器错误）然后，它构造一个JSON响应，
 * 其中包含错误的消息如果当前环境不是生产环境，还会包含错误的堆栈信息
 *
 * @param {Error} err 错误对象
 * @param {Object} req Express请求对象
 * @param {Object} res Express响应对象
 * @param {Function} next Express中的下一个中间件函数
 */
export const errorHandler = (err, req, res, next) => {
  // 确定响应的状态码如果当前状态码是200，则更改为500
  const statusCode = res.statusCode === 200 ? 500 : res.statusCode;
  res.status(statusCode);

  // 构造错误响应JSON对象
  res.json({
    message: err.message, // 错误消息
    // 根据环境决定是否包含错误堆栈信息生产环境中不包含，以避免暴露敏感信息
    stack: process.env.NODE_ENV === 'production' ? null : err.stack,
  });
};

